Plott med matplotlib

matplotlib er et bibliotek til Python som gjør det mulig å lage grafer og plott. Matplotlib er laget slik at det skal være enkelt for brukere av MATLAB til å gå over til Python. Det gjør at Matplotlib føles litt mindre pythonsk enn mange andre pythonbiblioteker.

Installasjon

Prøv å importere Matplotlib med følgende kode

import matplotlib.pyplot as plt

Hvis ikke Matplotlib er installert på datamaskinen så vil du få en feilmelding med No module found.

Du kan installere Matplotlib i gjennom Mu ved å gå til InnstillingerThird party packages og skrive inn matplotlib på en linje i vinduet før du trykker OK.

Bruker du en annen tekstbehandler så installerer du Matplotlib på samme måte som du installerer andre pakker – for eksempel med pip install matplotlib eller conda install matplotlib

Bruk matplotlib til å lage graf

Det finnes flere måter å opprette et plott på. Den enkleste moderne måten å gjøre dette er ved hjelp av subplots.

import matplotlib.pyplot as plt
fig, ax = plt.subplots()

Nå vil variabelen fig være tilordnet et Figure-objekt, mens ax er tilordnet et koordinatsystemobjekt.

Hva er fig?

Tenk på fig som lerretet som du tegner grafene oppå. Vi bruker metoder på fig hver gang vi ønsker å gjøre noe med lerretet.

  • fig.set_size_inches(6,4) vil gjøre figuren/lerretet 6 tommer bred og 4 tommer høy.
  • Når vi skal lagre alle grafene våre så bruker vi metoden fig.savefig("filnavn.svg").

Lag linjediagram med ax.plot()

Vi ønsker å vise noen data i plottet vårt. Matplotlib har mange ulike typer diagrammer og grafer innebygd. Den vanligste graftypen er linjediagrammet som er tilgjengelig med ax.plot(). Metoden trenger som et minimum argumentene x og y. Dette skal være to lister eller arrays med data. Listene må være like lange.

import matplotlib.pyplot as plt
import numpy as np
fig, ax = plt.subplots()
x = np.linspace(0,3,100)
y1 = x**2
y2 = 2*x

ax.plot(x, y1, c="blue", label="$x^2$")
ax.plot(x, y2, c="red", linestyle="dashed", label="$2x$")
ax.legend()
ax.set_title("$x^2$ og $2x$")
plt.show()

<rdf:RDF xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> cc:Work <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/> dc:date2023-10-13T21:31:51.922222</dc:date> dc:formatimage/svg+xml</dc:format> dc:creator cc:Agent dc:titleMatplotlib v3.6.3, https://matplotlib.org/</dc:title> </cc:Agent> </dc:creator> </cc:Work> </rdf:RDF>

Eksempelet ovenfor lager en Numpy array med 100 x-verdier mellom 0 og 3. Deretter lager den to nye arrays y1 og y2 som vil inneholde funksjonsverdiene til x2 og 2x for x[0,3].

ax.plot() kan ta inn mange flere argumenter enn hva jeg brukte ovenfor. Du finner en full oversikt i dokumentasjonen. I eksempelet mitt brukte jeg

I dette plottet har jeg også lagt inn en forklaringsboks med ax.legend() og en tittel på diagrammet med ax.set_title().[1] Til slutt er det viktig å gi beskjed om at plottet skal vises på skjermen med plt.show(). Du kan eventuelt lagre figuren med fig.savefig("filnavn.svg") eller plt.savefig("filnavn.png").

Sett egenskaper ved subplottet

Vi har allerede endret tittelen til subplottet med ax.set_title(). Vi kan også endre mange andre egenskaper ved subplottet. De viktigste egenskapene er:

Lag stolpediagram med ax.bar()

Det er enkelt å lage stolpediagrammer med ax.bar(). Se eksempelet nedenfor. Legg merke til at i dette tilfellet er x-verdiene er tekstkategorier. I stolpediagrammer kan x-verdiene være nærmest hva som helst.

import matplotlib.pyplot as plt

fig, ax = plt.subplots()

frukter = ['epler', 'pærer', 'bananer', 'appelsiner']
antall = [40, 100, 30, 55]

ax.bar(frukter, antall)

ax.set_ylabel('Antall frukter')
ax.set_title('Salg av ulike frukter')
plt.show()

<rdf:RDF xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> cc:Work <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/> dc:date2023-10-13T22:07:33.566302</dc:date> dc:formatimage/svg+xml</dc:format> dc:creator cc:Agent dc:titleMatplotlib v3.7.3, https://matplotlib.org/</dc:title> </cc:Agent> </dc:creator> </cc:Work> </rdf:RDF>

Lage histogram med ax.hist()

For å lage histogrammer kan du bruke ax.hist(). I eksempelet nedenfor så bruker jeg scipy.stats.binom.rvs til å lage 1000 utvalg fra en Binomisk fordeling med størrelse n=100 og p=0,3. De fleste utvalgene våre bør derfor inneholde omtrent 30 (fordi μ=np=1000,3=30).

from scipy.stats import binom
import matplotlib.pyplot as plt

fig, ax = plt.subplots()

N = 1000
 
# binom.rvs(n, p, size=N) trekker N stk fra binomisk fordeling
# med n og sannsynlighet p
X = binom.rvs(100, 0.3, size=N)

antall_stolper = 10     # antall stolper i histogrammet
ax.hist(X, bins=antall_stolper, density=True, edgecolor='white')
plt.show()

<rdf:RDF xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> cc:Work <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/> dc:date2023-10-13T22:19:36.778544</dc:date> dc:formatimage/svg+xml</dc:format> dc:creator cc:Agent dc:titleMatplotlib v3.7.3, https://matplotlib.org/</dc:title> </cc:Agent> </dc:creator> </cc:Work> </rdf:RDF>

Jeg brukte følgende parametere på ax.hist():

Legg til et enklere eksempel på histogram uten å bruke scipy

Tips

Lag flere subplots i samme figur

Hvis du vil ha flere plott på den samme figuren så gir du argumenter til subplots. Hvis du ønsker å ha 2 rader med 3 plott i hver rad kan du skrive:

fig, ax = plt.subplots(2,3)

ax er nå en nøstet liste med 2 × 3 koordinatsystemobjekter ordnet på denne måten:
[ [plott1, plott2, plott3], [plott4, plott5, plott6] ].

For å plotte noe i øverste venstre koordinatsystem (her kalt plott1) så bruker du ax[0, 0].plot(x_verdier, y_verdier) og for å plotte til det nedre, midterste koordinatsystemet (her kalt plott5) så skriver du ax[1, 1].plot(x_verdier, y_verdier).

Lag fine plott med koordinatakser med piler

I lærebøker så er det vanlig at koordinataksene skjærer i origo og er merket med piler i positiv retning. Du kan få denne stilen ved å følge dette eksempelet.

Plott av sinusfunksjon hvor koordinataksene skjærer origo og har piler som markerer positiv retning

Velg stilark

Matplotlib kommer med mange ferdige stilark, se hjemmesiden for et galleri med eksempler. Du velger stilark med

plt.style.use('default')

Jeg liker ggplot. For bruk på sider med mørk bakgrunn bruker jeg gjerne dark_background og lagrer figurene mine med fig.savefig("filnavn.svg", transparent=True). Da vil bakgrunnen være gjennomsiktig, men grafene får farger som fungerer fint på mørke bakgrunner.


  1. Jeg har valgt å bruke $$ rundt matematikk i forklaringstekster og titler. All tekst som står mellom dollartegnene blir tolket som LaTeX. Det gir et profesjonelt og flott utseende. ↩︎